/*
 * Resource.cpp
 *
 *  Created on: Oct 31, 2011
 *      Author: fferri
 */
#include "Resource.h"
#include "xmlNodeTree.h"
#include "Log/LogSystem.h"

namespace lpe {
	namespace resman {

		std::string Resource::DEF_APPENDER("");

		Resource::Resource(){}
		const uint32_t Resource::getID() const
		{
			return m_id;
		}
		Resource::~Resource(){}

		void Resource::clone(const Resource& res, const uint32_t id)
		{
			m_id = id;
			m_fileName = res.m_fileName;
			m_metadata = res.m_metadata;
			m_resType = res.m_resType;
		}
		uint32_t Resource::getResourceType()
		{
			return m_resType;
		}
		const std::string Resource::getFileName()
		{
			return m_fileName;
		}
		void Resource::initialize(uint32_t id, XMLNodeTree* xnode, const std::string& appender)
		{
			DEF_APPENDER= appender;
			// primero asigno el ID
			lpe::core::CUniqueIDXGenerator id_generator;
			m_id = (id == 0?id_generator.generate(): id);

			// Ahora proceso el xmlnodetree. En este caso solo saco el nombre del fichero que quiero cargar
			// pero derivando de esta clase podemos sacar cabeceras mucho mas detalladas.
			XMLNodeTree* xheader = xnode->getChildNodeByName("resourceHeader");
			XMLNodeTree* xFileNameNode = xheader->getChildNodeByName("filename");
			if(xFileNameNode == NULL)
			{
				THROW_EXCEPTION(lpe::core::resourceIncorrectFormatException, "El recurso no tiene un campo [filename]");
			}
			m_fileName = xFileNameNode->getNodeValueAsString();

			// Extraer el tipo de loader con que vamos a manejar esto.
			XMLNodeTree* xResTypeNode = xheader->getChildNodeByName("loaderID");
			m_resType = xResTypeNode->getNodeValueAsUnsignedInt();
			if(m_resType == 0)
			{
				glog::CGlobalLog::getSingleton().WARNING_MSG(DEF_APPENDER, "El recurso con ID %d tiene como 0 (o vacio), como valor del campo [loaderID].\n\t Se asume que ningun loader maneja la clase");
			}

			XMLNodeTree* metadata = xnode->getChildNodeByName("metadata");
			// adquirir metadatos
			for(uint32_t i = 0; i < metadata->getNumberOfChilds(); ++i)
			{
				XMLNodeTree* node = metadata->getChildNodeAt(i);
				m_metadata[node->getNodeName()] = node->getNodeValueAsString();
			}

		}

	}
}
